{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 1.加载word文档"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-10T02:38:32.605214Z",
     "start_time": "2025-04-10T02:38:32.435905Z"
    }
   },
   "source": [
    "# pip install docx2txt\n",
    "from langchain_community.document_loaders import Docx2txtLoader\n",
    "\n",
    "docx2txt = Docx2txtLoader(\"./data/docx.docx\")\n",
    "docx2txt.load()\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(metadata={'source': './data/docx.docx'}, page_content='报告编号：202504A0200000018                                                                                                                  报告版本：V1.0\\n\\n报告编号\\n\\n202504A0200000018\\n\\n报告版本\\n\\nV1.0\\n\\n总页数\\n\\n共23页\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n测试报告\\n\\nTESTING REPORT\\n\\n(本测试报告未经允许不得部分复制)\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n产品名称： 数字技术应用实践平台\\n\\n版 本 号 ： V1.0\\n\\n委托单位： 北京久其软件股份有限公司\\n\\n报告日期： 2025年04月07日\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n北京蜂语网络科技有限公司\\n\\n\\n\\n\\n\\n\\n\\n\\n注 意 事 项\\n\\n\\n\\n1、本测试报告未盖检测专用章无效。\\n\\n2、本测试报告未经允许不得部分复制。\\n\\n3、本测试报告无测试、审核、批准人签名或签章无效。\\n\\n4、本测试报告涂改无效。\\n\\n5、本测试报告未盖骑缝章无效。\\n\\n6、 本测试报告结束页的“           ”符号为报告结束标记。\\n\\n7、本测试报告仅对委托测试的样品版本及被测状态有效，当被测样品的版本或所部署环境、设备、设施等相关条件发生变化时，本测试报告可能不再适用。\\n\\n8、本测试报告版权归委托方和本公司共有，其他任何单位和个人均无权使用本测试报告。\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n地    址：北京市大兴区亦庄西环中路6号\\n\\n邮政编号：100176\\n\\n联系电话：400-0806-002\\n\\n邮    箱：beecode@beecode.cn\\n\\n网    址：https://www.beecode.cn/home\\n\\n\\n\\n\\n\\n修 订 页\\n\\n\\n\\n版本号\\n\\n修改内容摘要\\n\\n修改人\\n\\n修改日期\\n\\n备注\\n\\nV1.0\\n\\n新建\\n\\n杜朦\\n\\n2025-04-07\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n目    录\\n\\n\\t\\n\\n\\t\\n\\n\\t\\n\\n\\n\\n\\n\\n\\n\\n\\n测 试 报 告\\n\\n\\n\\n产品名称\\n\\n数字技术应用实践平台\\n\\n版 本 号\\n\\nV1.0\\n\\n测试类别\\n\\n功能测试\\n\\n委托单位\\n\\n北京久其软件股份有限公司\\n\\n委托方地址\\n\\n北京海淀区文慧园路文慧园甲12号院\\n\\n委托方联系人\\n\\n石立华\\n\\n委托方联系方式\\n\\n18906360372\\n\\n测试周期\\n\\n2025-03-27至2025-04-07\\n\\n生产单位\\n\\n北京久其软件股份有限公司\\n\\n测试地址\\n\\n北京市大兴区亦庄西环中路6号\\n\\n测试样品\\n\\n见“附件1、测试样品清单”\\n\\n测试环境\\n\\n见“附件2、测试硬件与软件环境”\\n\\n通过准则\\n\\n见“附件3、测试通过准则”\\n\\n测试依据\\n\\nGB/T25000.51-2016《系统与软件工程系统与软件质量 要求和评价(SQuaRE)第51部分：就绪可用软件产品(RUSP)的质量要求和测试细则》；\\n\\nGB/T25000.10-2016《系统与软件工程 系统与软件质量要求和评价（SQuaRE）第10部分：系统与软件质量模型》\\n\\n产品描述\\n\\n数字技术应用实践平台可运行于Linux平台， 使用Java语言开发，应用于高校产教融合、校企合作领域。\\n\\n本次测试内容主要包含技术底座、基础数据训练、数据建模训练、单据设计训练、\\t单据列表设计训练\\t、工作流设计训练\\t、竞赛模块、教学辅助模块。\\n\\n测试范围及方法\\n\\n根据《数字技术应用实践平台V1.0测试委托申请表V1.0》的要求，本次从用户文档、功能性和可靠性共3个方面进行产品测试，详细测试范围及方法如下：\\n\\n用户文档：主要通过阅读、比较、核实等方法检验文档完整性、正确性、一致性、易理解性等情况，检测的对象主要包括用户使用手册、界面引导说明等。\\n\\n功能性 ：覆盖测试委托申请表中要求的功能需求，采用因果图法、等价类划分法、边界值分析法、错误推测法、正交试验法等黑盒测试方法进行手工测试。\\n\\n可靠性：包括成熟性、可用性、容错性，主要对项目各系统涉及容错性的功能，如：有效性检验、数据一致性校验机制、 输入或用户误操作等进行测试。\\n\\n测试结论\\n\\n1、用户文档：用户文档信息描述正确，与软件功能一致，对系统的操作附加相应的图片说明，可为用户使用软件提供指引。\\n\\n2、功能性：被测模块功能运行稳定正常，主要的业务处理功能符合相关技术文档的要求。\\n\\n3、可靠性：对系统运行中可能出现的异常情况有相应的措施，对重要数据的输入和删除系统有数据校验，测试过程中未出现异常退出的情况。\\n\\n\\n\\n\\n\\n\\n\\n测试结果显示，该数字技术应用实践平台V1.0满足测试通过准则要求。\\n\\n\\n\\n测试结论： 通过       不通过\\n\\n\\n\\n\\n\\n北京蜂语网络科技有限公司     \\n\\n  2025年04月07日           \\n\\n测试\\n\\n\\n\\n日期\\n\\n\\n\\n审核\\n\\n\\n\\n日期\\n\\n\\n\\n批准\\n\\n\\n\\n日期\\n\\n\\n\\n\\n\\n\\n\\n\\n附件1 测试样品清单\\n\\n\\n\\n序号\\n\\n样品名称及版本\\n\\n存储形式\\n\\n数量\\n\\n样品编号\\n\\n1\\n\\n《数字技术应用实践平台用户手册 V1.0》\\n\\n电子版\\n\\n1份\\n\\n202504A0200000018 -01\\n\\n2\\n\\n数字技术应用实践平台V1.0\\n\\n电子版\\n\\n1份\\n\\n202504A0200000018 -02\\n\\n\\n\\n\\n\\n\\n\\n\\n附件2 测试硬件与软件环境\\n\\n\\n\\n2.1 服务端环境配置\\n\\n\\n\\n序  号\\n\\n硬件环境\\n\\n软件环境\\n\\n\\n\\n名称/型号\\n\\n配置\\n\\n软件名称版本号\\n\\n生产商/来源\\n\\n用途\\n\\n1\\n\\n服务器端：虚拟机\\n\\nCPU：Intel(R)\\n\\nXeon(R)Silver\\n\\n4208\\n\\n主频：2.10GHz\\n\\n内存：16GB\\n\\n硬盘：100GB\\n\\nLinux Ubuntu 20.04\\n\\nCanonical\\n\\n服务器端\\n\\n操作系统\\n\\n\\n\\n\\n\\n\\n\\nDocker 23.0.6\\n\\n开源\\n\\n应用容器引擎\\n\\n\\n\\n\\n\\n\\n\\nDocker Compose 2.17.3\\n\\n开源\\n\\n容器编排管理\\n\\n\\n\\n\\n\\n\\n\\nTomcat 9.0\\n\\nApache\\n\\n应用服务器\\n\\n\\n\\n\\n\\n\\n\\nRedis 6.2.5\\n\\n开源\\n\\n数据缓存\\n\\n\\n\\n\\n\\n\\n\\nRabbitMQ3.9.10\\n\\n开源\\n\\n消息队列\\n\\n\\n\\n\\n\\n\\n\\nMySQL 5.7\\n\\nOracle\\n\\n数据库\\n\\n\\n\\n\\n\\n\\n\\nJDK 1.8\\n\\nOracle\\n\\nJava运行环境\\n\\n\\n\\n\\n2.2 客户端环境配置\\n\\n序  号\\n\\n硬件环境\\n\\n软件环境\\n\\n\\n\\n名称/型号\\n\\n配置\\n\\n软件名称版本号\\n\\n生产商/来源\\n\\n用途\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n1\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n客户端：DELL\\n\\nVostro 3400\\n\\nCPU：Intel(R)\\n\\nCore(TM)i7-11370H\\n\\n主频：3.30GHz+4.80GHz\\n\\n内存：8GB\\n\\n硬盘：512GB\\n\\nWindows10专业版\\n\\nMicrosoft\\n\\n客户端操作系统\\n\\n\\n\\n\\n\\n\\n\\nMicrosoft Edge 116.0.1938.54\\n\\nMicrosoft\\n\\n浏览器\\n\\n\\n\\n\\n\\n\\n\\nWPS Office 11.1.0.14036\\n\\n金山办公软件有限公司\\n\\n文档工具\\n\\n2.3 网络环境\\n\\n\\n\\n序号\\n\\n网络类型\\n\\n带宽\\n\\n备注\\n\\n1\\n\\n局域网\\n\\n100Mbps\\n\\n\\n\\n2.4 温湿度环境\\n\\n\\n\\n序号\\n\\n环境类型\\n\\n环境参数\\n\\n备注\\n\\n1\\n\\n温度\\n\\n15℃-28℃\\n\\n\\n\\n2\\n\\n湿度\\n\\n30%-80%\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n附件3 测试通过准则\\n\\n\\n\\n3.1 缺陷严重程度划分\\n\\n\\n\\n严重性等级/名称\\n\\n说明\\n\\n1级\\n\\n致命\\n\\n不能执行正常功能或重要功能，或者危及人身安全。\\n\\n2级\\n\\n非常严重\\n\\n严重地影响系统要求或基本功能的实现，且没有办法解决。\\n\\n\\n\\n3级\\n\\n\\n\\n严重\\n\\n严重地影响系统要求或基本功能的实现，但存在合理的解决办法。\\n\\n\\n\\n4级\\n\\n\\n\\n一般\\n\\n使操作者不方便或遇到麻烦，但不影响执行工作功能或重要功能。\\n\\n5级\\n\\n轻微\\n\\n其它错误。\\n\\n\\n\\n3.2 测试结论与缺陷处理\\n\\n\\n\\n(1)测试结论分为通过和不通过。\\n\\n(2)当所有测试项的结果均为通过时，测试报告结论为通过，否则为不通过。\\n\\n\\n\\n\\n附件4 测试结果\\n\\n\\n\\n4.1 测试结果汇总\\n\\n\\n\\n序号\\n\\n测试内容\\n\\n测试结果\\n\\n1\\n\\n用户文档\\n\\n通过\\n\\n2\\n\\n功能性\\n\\n通过\\n\\n3\\n\\n可靠性\\n\\n通过\\n\\n4.2 测试结果详述\\n\\n\\n\\n4.2.1 用户文档\\n\\n通过准则：用户文档的索引和内容完整、正确，对程序的相关描述足够详细、准确，操作示例能够正确地体现软件的相应功能，以及示例中的操作确实 能够成功执行、且得到与描述一致的结果。\\n\\n序号\\n\\n文档名称\\n\\n1\\n\\n《数字技术应用实践平台用户手册 V1.0》\\n\\n\\n\\n\\n\\n序号\\n\\n测试项\\n\\n测试说明\\n\\n测试结果\\n\\n1DA\\n\\n可用性\\n\\n按照用户文档内容可正常使用该产品。\\n\\n通过\\n\\n2DA\\n\\n内容\\n\\n用户文档完整地说明了软件包含的功能 以及在程序中可以调用的功能。\\n\\n通过\\n\\n3DA\\n\\n标识和标示\\n\\n用户文档显示唯一标识。\\n\\n通过\\n\\n4DA\\n\\n完备性\\n\\n用户文档为用户学习如何使用该软件提 供信息。\\n\\n通过\\n\\n5DA\\n\\n正确性\\n\\n5.1DA\\n\\n信息正确\\n\\n用户文档中描述的信息正确，没有歧义 和错误的表达。\\n\\n通过\\n\\n5.2DA\\n\\n无错别字及二义性说明\\n\\n用户文档无错别字及二义性内容，屏幕截图和绘制图形中的文字与当前软件版 本一致。\\n\\n通过\\n\\n6DA\\n\\n易理解性\\n\\n6.1DA\\n\\n用户易理解\\n\\n用户文档有图形及信息源。\\n\\n通过\\n\\n\\n\\n4.2.2 功能性\\n\\n\\n\\n通过准则：软件按照测试委托申请表给定的形式正确表现，数据准确。\\n\\n\\n\\n序号\\n\\n测试项\\n\\n测试说明\\n\\n测试结果\\n\\n1FA\\n\\n技术底座\\n\\n1.1FA\\n\\n 国产化适配能力\\n\\n支持达梦、 瀚高、人大金仓、南大通用、神舟通用、海量数据等多种国产主流数据库；支持东方通、宝兰德、中创等国产主流中间件。\\n\\n通过\\n\\n1.2FA\\n\\n登录页管理\\n\\n支持全面定制，提供多种内置主题和个性化选项，可通过配置界面自定义布局、样式和元素，确保与公司品牌形象风格一致。\\n\\n - 提供多种预设主题，满足不同风格需求。\\n\\n - 提供个性化定制，包括布局、颜色、字体等，以适应特定品牌形象。\\n\\n通过\\n\\n1.3FA\\n\\n首页配置\\n\\n允许对系统首页进行细致的个性化定制，从而打造符合品牌形象的个性化首页。\\n\\n - 调整首页布局，如单栏、双栏或横向导航等。\\n\\n - 可自定义首页的整体显示效果，包括背景颜色或图片、边框样式、块区域大小、颜色和字体等。\\n\\n通过\\n\\n1.4FA\\n\\n机构类型管理\\n\\n提供灵活的组织机构类型数据的拓展与管理功能。\\n\\n - 可轻松管理机构类型数据，比如：机构类型标识、名称、备注信息。\\n\\n - 支持灵活扩展机构类型数据，比如法人、工商登记注册号…等自定义信息。\\n\\n通过\\n\\n1.5FA\\n\\n机构数据管理\\n\\n专注于构建组织机构关键数据的管理。\\n\\n - 组织代码、名称等关键信息管理。\\n\\n - 确保组织机构数据的集中性和一致性。\\n\\n通过\\n\\n1.6FA\\n\\n角色管理\\n\\n是基于角色权限控制系统中重要的权限管理单位，对用户权限的授予与撤销主要是通过角色进行控制。\\n\\n - 能够创建和配置角色。\\n\\n - 管理员权限用户（如admin和业务管理员）有权执行以上操作\\n\\n通过\\n\\n1.7FA\\n\\n用户管理\\n\\n负责系统内所有用户的信息维护和管理，并支持灵活的基于用户的权限授予与撤销控制。\\n\\n - 创建与管理用户账户，密码管理与重置密码。\\n\\n - 用户账号的启用与禁用、锁定或解锁。\\n\\n - 管理员权限用户（如admin和业务管理员）有权执行以上操作\\n\\n通过\\n\\n1.8FA\\n\\n访问权限管理\\n\\n授权管理，负责控制用户对系统资源的访问控制权限。\\n\\n - 支持基于角色或用户授权模式。\\n\\n通过\\n\\n1.9FA\\n\\n安全管理\\n\\n设置密码管理规则，加强用户管理账号密码安全性，密码校验规则包括但不限于小写字母、大写字母、数字、特殊字符，且支持设置密码必须满足已选项规则数目；加密算法包括但不限于BCrypt、国密SM3随机盐；支持设置用户敏感属性加密，至少提供不加密、AES128算法加密、国密SM4算法加密三种形式进行选择。\\n\\n通过\\n\\n1.10FA\\n\\n身份管理\\n\\n用于限制用户在同一组织下的身份，在该组织，用户只能有一个身份，当其拥有多重身份时，需支持身份切换帮助其实施该身份下对应的权限。\\n\\n通过\\n\\n1.11FA\\n\\n三员管理\\n\\n支持平台启用三员管理强化系统安全性，三类管理员，即系统管理员、安全保密员、安全审计员互相监督，分别承担不同的管理职责，共同维护系统安全稳定和信息安全，三类管理员不承担任务业务职责，至承担相应的管理职责。系统管理员维护组织机构，新增、修改、启用、停用、锁定用户，删除\"标记删除\"用户，为用户关联组织机构。顶级系统管理员可以新增、修改、删除角色，修改首页、系统选项等配置；安全保密员可以\"标记删除\"用户、解锁用户、配置用户权限、配置角色权限。顶级安全保密员可以审查业务用户日志；安全审计员可以查看用户、角色权限，进而监督系统管理员和安全保密员的配置。顶级安全审计员可以审查三员管理员的管理日志。\\n\\n通过\\n\\n1.12FA\\n\\n多界面方案\\n\\n启用后，每个界面方案可使用独立的菜单树，不同身份用户可在相同平台访问到不同方案的菜单栏配置。\\n\\n通过\\n\\n1.13FA\\n\\n对象存储管理\\n\\n创建域管理系统不同模块存储文件位置，支持多种存储方式，包括但不限于FTP存储、数据库、SFTP存储拓展、MongDB、文件系统，且在变更存储位置时支持放弃迁移对象及指定时间迁移保障存储路径变更途中不会影响到服务中文件的获取\\n\\n通过\\n\\n2FA\\n\\n基础数据训练\\n\\n2.1FA\\n\\n枚举数据管理\\n\\n\\n\\n\\n\\n\\n\\n预定义数据项通常代表特定的状态或类型数据，例如：性别、单据状态、证件类型等。\\n\\n - 系统内置枚举数据集。\\n\\n - 可自定义枚举数据集。\\n\\n - 高速缓存特性，读取性能优异。\\n\\n通过\\n\\n2.2FA\\n\\n基础数据-列表\\n\\n用于存储和管理持久化数据，以二维表结构形式组织数据。\\n\\n- 存储稳定且长期存在的数据项。\\n\\n- 以行为数据单位。\\n\\n- 每行记录有唯一编号，确保可识别性和追踪性。\\n\\n通过\\n\\n2.3FA\\n\\n基础数据-树结构\\n\\n- 支持无限递归，擅长存储具有层级关系的数据，有具只有一个根。\\n\\n- 通过Parent指定数据所属父结点，实现数据层级化管理。\\n\\n- 允许深度扩展，适于复杂的数据分类和组织。\\n\\n通过\\n\\n2.4FA\\n\\n基础数据-级次树\\n\\n通过指定树结点的编码规则，构建一棵有编码规则，且深度固定的树结构存储单元。\\n\\n- 擅长存储存在层级关系确定的数据。\\n\\n- 结点编码受编码规则约束。\\n\\n- 树深度受编码规则影响。\\n\\n通过\\n\\n2.5FA\\n\\n基础数据-分组列表\\n\\n由树与列表组织的衍生模式，直接明确数据归属关系，树结点作为列表数据的基准类别，实现数据的有效分类。\\n\\n- 允许在数据添加前就确定其存储分类。\\n\\n- 可以增强数据的组织性和检索效率，便于数据管理和查询。例如：员工与部门、车辆与分类。\\n\\n通过\\n\\n2.6FA\\n\\n虚拟基础数据\\n\\n将其他业务数据作为基础数据使用，该类基础数据新建过程中不实际在数据库中新建对应物理表存储数据，仅在基础数据管理列表中存在并显示，可作为分组基础数据的分组，可实现过滤公式，还可以对已有的基础数据进行数据过滤。虚拟对象需至少支持组织机构、自定义sql、基础数据三种。\\n\\n通过\\n\\n3FA\\n\\n数据建模训练\\n\\n3.1FA\\n\\n单据主表\\n\\n单据主表，是单据的核心数据表，集中管理单据的核心数据字段。\\n\\n- 主表中存储有单据的核心数据。\\n\\n- 便捷的连续新建字段，字段属性与关联数据设置。\\n\\n通过\\n\\n3.2FA\\n\\n单据子表\\n\\n对数据主表相关的子表数据进行管理，良好的主子表设计是开发的重要步骤。\\n\\n- 子表用于处理主表数据对象中具有多条记录且具有层级结构的情况。\\n\\n- 提供字段维护功能，允许自定义子表字段，属性设置与关联数据。\\n\\n通过\\n\\n4FA\\n\\n单据设计训练\\n\\n4.1FA\\n\\n单据规则\\n\\n - 统计函数支持区域求和、最大最小值计算、数值统计和非空单元格计数等，适用于数据汇总和分析。\\n\\n - 系统函数、日期函数和数学函数分别处理系统变量、日期运算和数学计算，满足不同数据处理需求。\\n\\n - 模型函数提供字段值获取、字段反写、用户信息获取、数据脱敏、数值转换等，用于特定数据处理场景。\\n\\n - 文本操作函数包括字符串截取、空白处理、字符查找、大小写转换、字符长度获取、拼接、替换和分隔字符处理等，增强文本数据处理能力。\\n\\n - 逻辑函数支持条件判断、空值检查和多条件逻辑运算，为复杂决策提供支持。\\n\\n - 所有函数可相互嵌套使用，为复杂数据处理提供灵活的轻量级解决方案。\\n\\n通过\\n\\n4.2FA\\n\\n单据界面\\n\\n提供便捷的单据界面设计，界面模板，界面方案等功能支持，可轻松实现界面设计工作。\\n\\n- 高效的控件与字段绑定，快速进行界面设计。\\n\\n- 强大的多界面解决方案，一单据多界面。\\n\\n通过\\n\\n4.3FA\\n\\n单据编号\\n\\n单据在使用前必须声明单据编号规则，单据执行时，将根据该规则生成唯一性的单据编号。\\n\\n- 单据编号通过由常量、机构代码、时间值、流水号等规则构成。\\n\\n- 良好的编号规则设计，将有利于单据查询和追溯。\\n\\n- 单据编号生成时机：支持新建时生成或保存时生成。新建时，可保证编号仅一次可见。\\n\\n\\n\\n通过\\n\\n4.4FA\\n\\n单据打印\\n\\n通过打印控件进行排版和页面设计，可快速形成打印方案。\\n\\n- 支持多打印方案设计。\\n\\n通过\\n\\n5FA\\n\\n单据列表设计训练\\n\\n5.1FA\\n\\n单据列表管理\\n\\n允许以列表形式管理单据，并可自定义显示列，高级搜索条件，多字段排序等设定。\\n\\n- 提供直观的界面，方便对单据进行数据管理操作。\\n\\n- 允许列表显示列，高级搜索快速定位所需单据。\\n\\n通过\\n\\n5.2FA\\n\\n自定义查询\\n\\n支持当前系统数据库查询和跨数据源查询\\n\\n通过\\n\\n6FA\\n\\n工作流设计训练\\n\\n6.1FA\\n\\n工作流管理\\n\\n定义和执行业务单据的处理流程，图形化的流程处理设计，实现业务单据的自动化审批。\\n\\n- 化繁为简的业务流程定义，每一步都有明确的参与者。\\n\\n- 确保按照既定工作流规则和顺序执行审批。\\n\\n- 有效提高业务处理效率和透明度，减少人为失误，确保审批业务的一致性和可追溯性。\\n\\n通过\\n\\n6.2FA\\n\\n业务与工作流绑定\\n\\n绑定三要素（单据、工作流、业务参与者），最终形成可执行的且完整的单据审批工作流。\\n\\n- 绑定参数取值，可为分支等流程处理提供数据支持。\\n\\n- 设置可编辑字段、可编辑子表，可为全面审批单据数据提供支持。\\n\\n- 通过审批界面，可为多界面单据审批，提供支持。\\n\\n通过\\n\\n6.3FA\\n\\n待办列表\\n\\n提醒用户未处理的审批任务，支持待办分类展示\\n\\n通过\\n\\n7FA\\n\\n竞赛模块\\n\\n7.1FA\\n\\n竞赛管理\\n\\n支持通过配置的方式完成竞赛试题的配置支持配置竞赛任 务、竞赛时间、竞赛内容，并支持配置检查点功能，包括检查项目、分值设置等内容。\\n\\n通过\\n\\n7.2FA\\n\\n竞赛环境\\n\\n支持竞赛环境检测、竞赛项目实时检查、竞赛赛题自动评分、竞赛结果汇总功能\\n\\n- 竞赛详细信息，确保学生了解竞赛情况。\\n\\n- 提供竞赛任务与要求，明确竞赛目标和规则。\\n\\n通过\\n\\n7.3FA\\n\\n竞赛成绩\\n\\n提供便捷的成绩汇总接收、查看、管理和导出等功能，方便管理学生竞赛成绩。\\n\\n- 成绩列表，允许排序，筛选，快速浏览和管理成绩信息。\\n\\n- 成绩导出功能，可方便的导出Excel等格式数据，便于详细分析和存档保存。\\n\\n通过\\n\\n8FA\\n\\n教学辅助模块\\n\\n8.1FA\\n\\n检查点管理\\n\\n支持教师对课程内容设置检查点，系统支持表数据检查法、表名称检查法、列名检查法、表条数检查法、请求检查法、页面检查法、远程命令检查法、本地命令检查法、元素检查法、相似度检查法报告检查法11种检查方式，满足教学的各类场景，并支持将11种检查项目绑定到功能菜单受权限控制。\\n\\n1）表数据检查法：支持通过数据查询的方式检查实训内容是否符合要求，支持逻辑查询、关系查询、等值查询、模糊查询等方式，并链式执行多个检查，可实时保存和展示检查结果，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。。\\n\\n2）表名称检查法：支持通过表名称的方式检查实训内容的完成情况，支持本地和远程任何库中表结构是否存在，并链式执行多个检查，实时保存和展示检查结果，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n3）列名检查法：支持通过列名称的方式检查实训内容的完成情况，支持本地和远程任何库中表结构是否存在，并链式执行多个检查，实时保存和展示检查结果，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n4）表条数检查法：支持通过获取数据条数的方式检查实训内容是否符合要求，支持逻辑查询、关系查询、等值查询、模糊查询等方式，可链式执行多个检查，实时保存和展示检查结果，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n5）请求检查法：支持通过请求的方式检查实训内容是否符合要求，支持GET、POST、PUT、DELETE的请求方式；支持header、formData、json、二进制的类型参数，具有执行并展示结果的能力，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n6）页面检查法：支持可写即可见的页面检查方式，实时解析输入的代码呈现页面效果；教师可根据学生输入呈现的页面效果和标准效果效果比对，从而完成课程内容的检查，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n7）远程命令检查法：支持通过远程命令的方式检查实训内容的完成情况，可通过此方式检查远程中间件、服务器配置是否满足要求，并具有展示结果的能力，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n8）本地命令检查法：支持通过本地命令的方式检查实训内容的完成情况，可通过此方式检查本地中间件、服务器配置是否满足要求，并具有展示结果的能力，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n9）元素检查法：支持通过检查页面元素的方式检查实训内容是否符合要求，并具有展示检查结果的能力，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n10）相似度检查法：支持通过输入代码检查与标准答案进行对比，从而检查实训内容是否满足规范，并具有展示检查结果的能力，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n11）报告检查法：支持教室自定义设计实验报告，具有实时渲染报告的能力，具有展示检查结果的能力，以及具备将检查页面绑定到功能菜单的能力并可通过权限控制。\\n\\n通过\\n\\n8.2FA\\n\\n文档管理\\n\\n管理平台教学文档类资源，包括课程大纲、任务单、课件和教案等。\\n\\n- 可以下载、编辑、上传教学资源文档\\n\\n通过\\n\\n8.3FA\\n\\n数据管理\\n\\n备份恢复，通过策略化的数据备份与还原，可有效确保数据安全、完整性及业务连续性。\\n\\n- 有效防止数据丢失和确保灾难恢复能力。\\n\\n- 定期的备份与恢复，迅速恢复数据。\\n\\n通过\\n\\n8.4FA\\n\\n视频管理\\n\\n可组织、分类和管理大量视频内容，并通过流畅的视频播放提供优质的视频教学与学习体验。\\n\\n- 支持多种格式，确保视频播放流畅无阻\\n\\n通过\\n\\n\\n\\n4.2.3可靠性\\n\\n通过准则：对系统运行中可能出现的各种异常情况和突发事件有相应的应急手段，保证系统安全性的同时可正常工作。\\n\\n序号\\n\\n测试项\\n\\n测试说明\\n\\n测试结果\\n\\n1RE\\n\\n成熟性\\n\\n\\n\\n1.1RE\\n\\n重要数据删除提示\\n\\n对重要数据的删除操作，系统有警告及确认提示。\\n\\n\\n\\n通过\\n\\n1.2RE\\n\\n数据输入检查提示\\n\\n对重要数据输入时系统能进行检查，并对用户的非法输入值给出对应的提示信息。\\n\\n通过\\n\\n1.3RE\\n\\n异常退出\\n\\n操作中系统无异常退出的情况。\\n\\n通过\\n\\n2RE\\n\\n可用性\\n\\n2.1RE\\n\\n运行稳定\\n\\n系统访问正常且运行稳定。\\n\\n通过\\n\\n3RE\\n\\n容错性\\n\\n系统能屏蔽用户常见的错误操作，以及 当软件发生错误时，系统能进行提示。\\n\\n通过\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n                                                                   \\n\\n\\n\\n\\n\\n第 1 页 共 37 页\\n\\n第 1 页 共 37 页北京蜂语网络科技有限公司                                                                    \\n\\n\\n\\n北京蜂语网络科技有限公司\\n\\n第 2 页 共 37 页\\n\\n第 2 页 共 37 页')]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 2.加载PDF"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-10T02:41:44.950387Z",
     "start_time": "2025-04-10T02:41:44.079090Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# pip install pypdf\n",
    "from langchain_community.document_loaders import PyPDFLoader\n",
    "pdf_loader = PyPDFLoader(\"./data/pdfs.pdf\")\n",
    "pdf_loader.load()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 0, 'page_label': '1'}, page_content='报告编号 202504A0200000018\\n报告版本 V1.0\\n总页数 共23页\\n测试报告\\nTESTING REPORT\\n(本测试报告未经允许不得部分复制)\\n产品名称： 数字技术应用实践平台\\n版本号：V1.0\\n委托单位： 北京久其软件股份有限公司\\n报告日期： 2025年04月07日\\n北京蜂语网络科技有限公司'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 1, 'page_label': '2'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 2 页 共 21 页\\n注 意 事 项\\n1、本测试报告未盖检测专用章无效。\\n2、本测试报告未经允许不得部分复制。\\n3、本测试报告无测试、审核、批准人签名或签章无效。\\n4、本测试报告涂改无效。\\n5、本测试报告未盖骑缝章无效。\\n6、本测试报告结束页的“ ”符号为报告结束标记。\\n7、本测试报告仅对委托测试的样品版本及被测状态有效，当被测样品的版本或所部署环境\\n、设备、设施等相关条件发生变化时，本测试报告可能不再适用。\\n8、本测试报告版权归委托方和本公司共有，其他任何单位和个人均无权使用本测试报告。\\n地 址：北京市大兴区亦庄西环中路6号\\n邮政编号：100176\\n联系电话：400-0806-002\\n邮 箱：beecode@beecode.cn\\n网 址：https://www.beecode.cn/home'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 2, 'page_label': '3'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 3 页 共 21 页\\n修 订 页\\n版本号 修改内容摘要 修改人 修改日期 备注\\nV1.0 新建 杜朦 2025-04-07'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 3, 'page_label': '4'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 4 页 共 21 页\\n目 录'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 4, 'page_label': '5'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 5 页 共 21 页\\n测 试 报 告\\n产品名称 数字技术应用实践平台\\n版 本 号 V1.0 测试类别 功能测试\\n委托单位 北京久其软件股份有限公司\\n委托方地址 北京海淀区文慧园路文慧园甲12号院\\n委托方联系人 石立华 委托方联系方式 18906360372\\n测试周期 2025-03-27至2025-04-07\\n生产单位 北京久其软件股份有限公司\\n测试地址 北京市大兴区亦庄西环中路6号\\n测试样品 见“附件1、测试样品清单”\\n测试环境 见“附件2、测试硬件与软件环境”\\n通过准则 见“附件3、测试通过准则”\\n测试依据\\n1. GB/T25000.51-2016《系统与软件工程系统与软件质量 要求和评价\\n(SQuaRE)第51部分：就绪可用软件产品(RUSP)的质量要求和测试细则\\n》；\\n2. GB/T25000.10-2016《系统与软件工程 系统与软件质量要求和评价（S\\nQuaRE）第10部分：系统与软件质量模型》\\n产品描述\\n数字技术应用实践平台可运行于Linux平台， 使用Java语言开发，应用\\n于高校产教融合、校企合作领域。\\n本次测试内容主要包含技术底座、基础数据训练、数据建模训练、单\\n据设计训练、 单据列表设计训练 、工作流设计训练 、竞赛模块、教学辅\\n助模块。'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 5, 'page_label': '6'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 6 页 共 21 页\\n测试范围及方法\\n根据《数字技术应用实践平台V1.0测试委托申请表V1.0》的要求，\\n本次从用户文档、功能性和可靠性共3个方面进行产品测试，详细测试范\\n围及方法如下：\\n用户文档：主要通过阅读、比较、核实等方法检验文档完整性、正\\n确性、一致性、易理解性等情况，检测的对象主要包括用户使用手册、\\n界面引导说明等。\\n功能性：覆盖测试委托申请表中要求的功能需求，采用因果图法、等\\n价类划分法、边界值分析法、错误推测法、正交试验法等黑盒测试方法\\n进行手工测试。\\n可靠性：包括成熟性、可用性、容错性，主要对项目各系统涉及容错\\n性的功能，如：有效性检验、数据一致性校验机制、输入或用户误操作等\\n进行测试。\\n测试结论\\n1、用户文档：用户文档信息描述正确，与软件功能一致，对系统的\\n操作附加相应的图片说明，可为用户使用软件提供指引。\\n2、功能性：被测模块功能运行稳定正常，主要的业务处理功能符合\\n相关技术文档的要求。\\n3、可靠性：对系统运行中可能出现的异常情况有相应的措施，对重\\n要数据的输入和删除系统有数据校验，测试过程中未出现异常退出的情况\\n。'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 6, 'page_label': '7'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 7 页 共 21 页\\n测试结果显示，该数字技术应用实践平台V1.0满足测试通过准则要\\n求。\\n测试结论： \\uf052通过 \\uf0a3不通过\\n北京蜂语网络科技有限公司\\n2025年04月07日\\n测试 日期\\n审核 日期\\n批准 日期'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 7, 'page_label': '8'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 8 页 共 21 页\\n附件1 测试样品清单\\n序号 样品名称及版本 存储形式 数量 样品编号\\n1 《数字技术应用实践平台用\\n户手册 V1.0》\\n电子版 1份 202504A0200000018-01\\n2 数字技术应用实践平台V1.0 电子版 1份 202504A0200000018-02'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 8, 'page_label': '9'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 9 页 共 21 页\\n附件2 测试硬件与软件环境\\n2.1服务端环境配置\\n序\\n号\\n硬件环境 软件环境\\n名称/型号 配置 软件名称版本号 生产商/来源 用途\\n1 服务器端：虚\\n拟机\\nCPU：Intel(R)\\nXeon(R)Silver\\n4208\\n主频：2.10GHz\\n内存：16GB\\n硬盘：100GB\\nLinuxUbuntu20.04 Canonical\\n服务器端\\n操作系统\\nDocker23.0.6 开源 应用容器引\\n擎\\nDockerCompose2.17.3 开源 容器编排管\\n理\\nTomcat9.0 Apache 应用服务器\\nRedis6.2.5 开源 数据缓存\\nRabbitMQ3.9.10 开源 消息队列\\nMySQL5.7 Oracle 数据库\\nJDK1.8 Oracle Java运行环\\n境'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 9, 'page_label': '10'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 10 页 共 21 页\\n2.2客户端环境配置\\n序\\n号 硬件环境 软件环境\\n名称/型号 配置 软件名称版本号 生产商/来源 用途\\n1\\n客户端：\\nDELL\\nVostro3400\\nCPU：Intel(R)\\nCore(TM)i7-\\n11370H\\n主频：\\n3.30GHz+4.80GHz\\n内存：8GB\\n硬盘：512GB\\nWindows10专业版 Microsoft 客户端操作\\n系统\\nMicrosoftEdge\\n116.0.1938.54 Microsoft 浏览器\\nWPSOffice\\n11.1.0.14036\\n金山办公软件\\n有限公司 文档工具\\n2.3 网络环境\\n序号 网络类型 带宽 备注\\n1 局域网 100Mbps\\n2.4温湿度环境\\n序号 环境类型 环境参数 备注\\n1 温度 15℃-28℃\\n2 湿度 30%-80%'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 10, 'page_label': '11'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 11 页 共 21 页\\n附件3 测试通过准则\\n3.1 缺陷严重程度划分\\n严重性等级/名称 说明\\n1级 致命 不能执行正常功能或重要功能，或者危及人身安全。\\n2级 非常严重 严重地影响系统要求或基本功能的实现，且没有办法解决。\\n3级 严重\\n严重地影响系统要求或基本功能的实现，但存在合理的解决\\n办法。\\n4级 一般\\n使操作者不方便或遇到麻烦，但不影响执行工作功能或重要功\\n能。\\n5级 轻微 其它错误。\\n3.2测试结论与缺陷处理\\n(1)测试结论分为通过和不通过。\\n(2)当所有测试项的结果均为通过时，测试报告结论为通过，否则为不通过。'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 11, 'page_label': '12'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 12 页 共 21 页\\n附件4 测试结果\\n4.1测试结果汇总\\n序号 测试内容 测试结果\\n1 用户文档 通过\\n2 功能性 通过\\n3 可靠性 通过\\n4.2测试结果详述\\n4.2.1用户文档\\n通过准则：用户文档的索引和内容完整、正确，对程序的相关描述足够详细、准确，操\\n作示例能够正确地体现软件的相应功能，以及示例中的操作确实 能够成功执行、且得到与\\n描述一致的结果。\\n序号 文档名称\\n1 《数字技术应用实践平台用户手册 V1.0》\\n序号 测试项 测试说明 测试结果\\n1DA 可用性 按照用户文档内容可正常使用该产品。 通过\\n2DA 内容 用户文档完整地说明了软件包含的功能 以及在\\n程序中可以调用的功能。 通过\\n3DA 标识和标示 用户文档显示唯一标识。 通过\\n4DA 完备性 用户文档为用户学习如何使用该软件提 供信息\\n。 通过\\n5DA 正确性\\n5.1DA 信息正确 用户文档中描述的信息正确，没有歧义和错误\\n的表达。\\n通过\\n5.2DA 无错别字及二\\n义性说明\\n用户文档无错别字及二义性内容，屏幕截图和\\n绘制图形中的文字与当前软件版 本一致。 通过\\n6DA 易理解性\\n6.1DA 用户易理解 用户文档有图形及信息源。 通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 12, 'page_label': '13'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 13 页 共 21 页\\n4.2.2功能性\\n通过准则：软件按照测试委托申请表给定的形式正确表现，数据准确。\\n序号 测试项 测试说明 测试结果\\n1FA 技术底座\\n1.1FA 国产化适配能\\n力\\n支持达梦、 瀚高、人大金仓、南大通用、神舟通用、海\\n量数据等多种国产主流数据库；支持东方通、宝兰德、\\n中创等国产主流中间件。\\n通过\\n1.2FA 登录页管理\\n支持全面定制，提供多种内置主题和个性化选项，可通\\n过配置界面自定义布局、样式和元素，确保与公司品牌\\n形象风格一致。\\n-提供多种预设主题，满足不同风格需求。\\n-提供个性化定制，包括布局、颜色、字体等，以适应\\n特定品牌形象。\\n通过\\n1.3FA 首页配置\\n允许对系统首页进行细致的个性化定制，从而打造符合\\n品牌形象的个性化首页。\\n-调整首页布局，如单栏、双栏或横向导航等。\\n-可自定义首页的整体显示效果，包括背景颜色或图片\\n、边框样式、块区域大小、颜色和字体等。\\n通过\\n1.4FA 机构类型管理\\n提供灵活的组织机构类型数据的拓展与管理功能。\\n-可轻松管理机构类型数据，比如：机构类型标识、名\\n称、备注信息。\\n-支持灵活扩展机构类型数据，比如法人、工商登记注\\n册号…等自定义信息。\\n通过\\n1.5FA 机构数据管理\\n专注于构建组织机构关键数据的管理。\\n-组织代码、名称等关键信息管理。\\n-确保组织机构数据的集中性和一致性。\\n通过\\n1.6FA 角色管理\\n是基于角色权限控制系统中重要的权限管理单位，对用\\n户权限的授予与撤销主要是通过角色进行控制。\\n-能够创建和配置角色。\\n-管理员权限用户（如admin和业务管理员）有权执行\\n以上操作\\n通过\\n1.7FA 用户管理\\n负责系统内所有用户的信息维护和管理，并支持灵活的\\n基于用户的权限授予与撤销控制。\\n通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 13, 'page_label': '14'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 14 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n-创建与管理用户账户，密码管理与重置密码。\\n-用户账号的启用与禁用、锁定或解锁。\\n-管理员权限用户（如admin和业务管理员）有权执行\\n以上操作\\n1.8FA 访问权限管理\\n授权管理，负责控制用户对系统资源的访问控制权限。\\n-支持基于角色或用户授权模式。\\n通过\\n1.9FA 安全管理\\n设置密码管理规则，加强用户管理账号密码安全性，密\\n码校验规则包括但不限于小写字母、大写字母、数字、\\n特殊字符，且支持设置密码必须满足已选项规则数目；\\n加密算法包括但不限于BCrypt、国密SM3随机盐；支持\\n设置用户敏感属性加密，至少提供不加密、AES128算法\\n加密、国密SM4算法加密三种形式进行选择。\\n通过\\n1.10FA 身份管理\\n用于限制用户在同一组织下的身份，在该组织，用户只\\n能有一个身份，当其拥有多重身份时，需支持身份切换\\n帮助其实施该身份下对应的权限。\\n通过\\n1.11FA 三员管理\\n支持平台启用三员管理强化系统安全性，三类管理员，\\n即系统管理员、安全保密员、安全审计员互相监督，分\\n别承担不同的管理职责，共同维护系统安全稳定和信息\\n安全，三类管理员不承担任务业务职责，至承担相应的\\n管理职责。系统管理员维护组织机构，新增、修改、启\\n用、停用、锁定用户，删除\"标记删除\"用户，为用户关\\n联组织机构。顶级系统管理员可以新增、修改、删除角\\n色，修改首页、系统选项等配置；安全保密员可以\"标\\n记删除\"用户、解锁用户、配置用户权限、配置角色权\\n限。顶级安全保密员可以审查业务用户日志；安全审计\\n员可以查看用户、角色权限，进而监督系统管理员和安\\n全保密员的配置。顶级安全审计员可以审查三员管理员\\n的管理日志。\\n通过\\n1.12FA 多界面方案\\n启用后，每个界面方案可使用独立的菜单树，不同身份\\n用户可在相同平台访问到不同方案的菜单栏配置。\\n通过\\n1.13FA 对象存储管理\\n创建域管理系统不同模块存储文件位置，支持多种存储\\n方式，包括但不限于FTP存储、数据库、SFTP存储拓展\\n、MongDB、文件系统，且在变更存储位置时支持放弃\\n通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 14, 'page_label': '15'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 15 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n迁移对象及指定时间迁移保障存储路径变更途中不会影\\n响到服务中文件的获取\\n2FA 基础数据训练\\n2.1FA\\n枚举数据管理\\n预定义数据项通常代表特定的状态或类型数据，例如：\\n性别、单据状态、证件类型等。\\n-系统内置枚举数据集。\\n-可自定义枚举数据集。\\n-高速缓存特性，读取性能优异。\\n通过\\n2.2FA 基础数据-列表\\n用于存储和管理持久化数据，以二维表结构形式组织数\\n据。\\n-存储稳定且长期存在的数据项。\\n-以行为数据单位。\\n-每行记录有唯一编号，确保可识别性和追踪性。\\n通过\\n2.3FA 基础数据-树结\\n构\\n-支持无限递归，擅长存储具有层级关系的数据，有具\\n只有一个根。\\n-通过Parent指定数据所属父结点，实现数据层级化管理\\n。\\n-允许深度扩展，适于复杂的数据分类和组织。\\n通过\\n2.4FA 基础数据-级次\\n树\\n通过指定树结点的编码规则，构建一棵有编码规则，且\\n深度固定的树结构存储单元。\\n-擅长存储存在层级关系确定的数据。\\n-结点编码受编码规则约束。\\n-树深度受编码规则影响。\\n通过\\n2.5FA 基础数据-分组\\n列表\\n由树与列表组织的衍生模式，直接明确数据归属关系，\\n树结点作为列表数据的基准类别，实现数据的有效分类\\n。\\n-允许在数据添加前就确定其存储分类。\\n-可以增强数据的组织性和检索效率，便于数据管理和\\n查询。例如：员工与部门、车辆与分类。\\n通过\\n2.6FA 虚拟基础数据\\n将其他业务数据作为基础数据使用，该类基础数据新建\\n过程中不实际在数据库中新建对应物理表存储数据，仅\\n在基础数据管理列表中存在并显示，可作为分组基础数\\n据的分组，可实现过滤公式，还可以对已有的基础数据\\n通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 15, 'page_label': '16'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 16 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n进行数据过滤。虚拟对象需至少支持组织机构、自定义\\nsql、基础数据三种。\\n3FA 数据建模训练\\n3.1FA 单据主表\\n单据主表，是单据的核心数据表，集中管理单据的核心\\n数据字段。\\n-主表中存储有单据的核心数据。\\n-便捷的连续新建字段，字段属性与关联数据设置。\\n通过\\n3.2FA 单据子表\\n对数据主表相关的子表数据进行管理，良好的主子表设\\n计是开发的重要步骤。\\n-子表用于处理主表数据对象中具有多条记录且具有层\\n级结构的情况。\\n-提供字段维护功能，允许自定义子表字段，属性设置\\n与关联数据。\\n通过\\n4FA 单据设计训练\\n4.1FA 单据规则\\n-统计函数支持区域求和、最大最小值计算、数值统计\\n和非空单元格计数等，适用于数据汇总和分析。\\n-系统函数、日期函数和数学函数分别处理系统变量、\\n日期运算和数学计算，满足不同数据处理需求。\\n-模型函数提供字段值获取、字段反写、用户信息获取\\n、数据脱敏、数值转换等，用于特定数据处理场景。\\n-文本操作函数包括字符串截取、空白处理、字符查找\\n、大小写转换、字符长度获取、拼接、替换和分隔字符\\n处理等，增强文本数据处理能力。\\n-逻辑函数支持条件判断、空值检查和多条件逻辑运算\\n，为复杂决策提供支持。\\n-所有函数可相互嵌套使用，为复杂数据处理提供灵活\\n的轻量级解决方案。\\n通过\\n4.2FA 单据界面\\n提供便捷的单据界面设计，界面模板，界面方案等功能\\n支持，可轻松实现界面设计工作。\\n-高效的控件与字段绑定，快速进行界面设计。\\n-强大的多界面解决方案，一单据多界面。\\n通过\\n4.3FA 单据编号\\n单据在使用前必须声明单据编号规则，单据执行时，将\\n根据该规则生成唯一性的单据编号。\\n通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 16, 'page_label': '17'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 17 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n-单据编号通过由常量、机构代码、时间值、流水号等\\n规则构成。\\n-良好的编号规则设计，将有利于单据查询和追溯。\\n-单据编号生成时机：支持新建时生成或保存时生成。\\n新建时，可保证编号仅一次可见。\\n4.4FA 单据打印\\n通过打印控件进行排版和页面设计，可快速形成打印方\\n案。\\n-支持多打印方案设计。\\n通过\\n5FA 单据列表设计训练\\n5.1FA 单据列表管理\\n允许以列表形式管理单据，并可自定义显示列，高级搜\\n索条件，多字段排序等设定。\\n-提供直观的界面，方便对单据进行数据管理操作。\\n-允许列表显示列，高级搜索快速定位所需单据。\\n通过\\n5.2FA 自定义查询 支持当前系统数据库查询和跨数据源查询 通过\\n6FA 工作流设计训练\\n6.1FA 工作流管理\\n定义和执行业务单据的处理流程，图形化的流程处理设\\n计，实现业务单据的自动化审批。\\n-化繁为简的业务流程定义，每一步都有明确的参与者\\n。\\n-确保按照既定工作流规则和顺序执行审批。\\n-有效提高业务处理效率和透明度，减少人为失误，确\\n保审批业务的一致性和可追溯性。\\n通过\\n6.2FA 业务与工作流\\n绑定\\n绑定三要素（单据、工作流、业务参与者），最终形成\\n可执行的且完整的单据审批工作流。\\n-绑定参数取值，可为分支等流程处理提供数据支持。\\n-设置可编辑字段、可编辑子表，可为全面审批单据数\\n据提供支持。\\n-通过审批界面，可为多界面单据审批，提供支持。\\n通过\\n6.3FA 待办列表 提醒用户未处理的审批任务，支持待办分类展示 通过\\n7FA 竞赛模块\\n7.1FA 竞赛管理\\n支持通过配置的方式完成竞赛试题的配置支持配置竞赛\\n任务、竞赛时间、竞赛内容，并支持配置检查点功能，\\n通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 17, 'page_label': '18'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 18 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n包括检查项目、分值设置等内容。\\n7.2FA 竞赛环境\\n支持竞赛环境检测、竞赛项目实时检查、竞赛赛题自动\\n评分、竞赛结果汇总功能\\n-竞赛详细信息，确保学生了解竞赛情况。\\n-提供竞赛任务与要求，明确竞赛目标和规则。\\n通过\\n7.3FA 竞赛成绩\\n提供便捷的成绩汇总接收、查看、管理和导出等功能，\\n方便管理学生竞赛成绩。\\n-成绩列表，允许排序，筛选，快速浏览和管理成绩信\\n息。\\n-成绩导出功能，可方便的导出Excel等格式数据，便于\\n详细分析和存档保存。\\n通过\\n8FA 教学辅助模块\\n8.1FA 检查点管理\\n支持教师对课程内容设置检查点，系统支持表数据检查\\n法、表名称检查法、列名检查法、表条数检查法、请求\\n检查法、页面检查法、远程命令检查法、本地命令检查\\n法、元素检查法、相似度检查法报告检查法11种检查方\\n式，满足教学的各类场景，并支持将11种检查项目绑定\\n到功能菜单受权限控制。\\n1）表数据检查法：支持通过数据查询的方式检查实训\\n内容是否符合要求，支持逻辑查询、关系查询、等值查\\n询、模糊查询等方式，并链式执行多个检查，可实时保\\n存和展示检查结果，以及具备将检查页面绑定到功能菜\\n单的能力并可通过权限控制。。\\n2）表名称检查法：支持通过表名称的方式检查实训内\\n容的完成情况，支持本地和远程任何库中表结构是否存\\n在，并链式执行多个检查，实时保存和展示检查结果，\\n以及具备将检查页面绑定到功能菜单的能力并可通过权\\n限控制。\\n3）列名检查法：支持通过列名称的方式检查实训内容\\n的完成情况，支持本地和远程任何库中表结构是否存在\\n，并链式执行多个检查，实时保存和展示检查结果，以\\n及具备将检查页面绑定到功能菜单的能力并可通过权限\\n控制。\\n通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 18, 'page_label': '19'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 19 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n4）表条数检查法：支持通过获取数据条数的方式检查\\n实训内容是否符合要求，支持逻辑查询、关系查询、等\\n值查询、模糊查询等方式，可链式执行多个检查，实时\\n保存和展示检查结果，以及具备将检查页面绑定到功能\\n菜单的能力并可通过权限控制。\\n5）请求检查法：支持通过请求的方式检查实训内容是\\n否符合要求，支持GET、POST、PUT、DELETE的请求\\n方式；支持header、formData、json、二进制的类型参数\\n，具有执行并展示结果的能力，以及具备将检查页面绑\\n定到功能菜单的能力并可通过权限控制。\\n6）页面检查法：支持可写即可见的页面检查方式，实\\n时解析输入的代码呈现页面效果；教师可根据学生输入\\n呈现的页面效果和标准效果效果比对，从而完成课程内\\n容的检查，以及具备将检查页面绑定到功能菜单的能力\\n并可通过权限控制。\\n7）远程命令检查法：支持通过远程命令的方式检查实\\n训内容的完成情况，可通过此方式检查远程中间件、服\\n务器配置是否满足要求，并具有展示结果的能力，以及\\n具备将检查页面绑定到功能菜单的能力并可通过权限控\\n制。\\n8）本地命令检查法：支持通过本地命令的方式检查实\\n训内容的完成情况，可通过此方式检查本地中间件、服\\n务器配置是否满足要求，并具有展示结果的能力，以及\\n具备将检查页面绑定到功能菜单的能力并可通过权限控\\n制。\\n9）元素检查法：支持通过检查页面元素的方式检查实\\n训内容是否符合要求，并具有展示检查结果的能力，以\\n及具备将检查页面绑定到功能菜单的能力并可通过权限\\n控制。\\n10）相似度检查法：支持通过输入代码检查与标准答案\\n进行对比，从而检查实训内容是否满足规范，并具有展\\n示检查结果的能力，以及具备将检查页面绑定到功能菜\\n单的能力并可通过权限控制。'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 19, 'page_label': '20'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 20 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n11）报告检查法：支持教室自定义设计实验报告，具有\\n实时渲染报告的能力，具有展示检查结果的能力，以及\\n具备将检查页面绑定到功能菜单的能力并可通过权限控\\n制。\\n8.2FA 文档管理\\n管理平台教学文档类资源，包括课程大纲、任务单、课\\n件和教案等。\\n-可以下载、编辑、上传教学资源文档\\n通过\\n8.3FA 数据管理\\n备份恢复，通过策略化的数据备份与还原，可有效确保\\n数据安全、完整性及业务连续性。\\n-有效防止数据丢失和确保灾难恢复能力。\\n-定期的备份与恢复，迅速恢复数据。\\n通过\\n8.4FA 视频管理\\n可组织、分类和管理大量视频内容，并通过流畅的视频\\n播放提供优质的视频教学与学习体验。\\n-支持多种格式，确保视频播放流畅无阻\\n通过\\n4.2.3可靠性\\n通过准则：对系统运行中可能出现的各种异常情况和突发事件有相应的应急手段，保\\n证系统安全性的同时可正常工作。\\n序号 测试项 测试说明 测试结果\\n1RE 成熟性\\n1.1RE\\n重要数据删除\\n提示\\n对重要数据的删除操作，系统有警告及确认\\n提示。 通过\\n1.2RE\\n数据输入检查\\n提示\\n对重要数据输入时系统能进行检查，并对用户\\n的非法输入值给出对应的提示信息。\\n通过\\n1.3RE 异常退出 操作中系统无异常退出的情况。 通过\\n2RE 可用性\\n2.1RE 运行稳定 系统访问正常且运行稳定。 通过'),\n",
       " Document(metadata={'producer': 'macOS 版本12.7.6（版号21H1320） Quartz PDFContext', 'creator': 'WPS 文字', 'creationdate': '2025-04-10T10:40:03+08:00', 'author': 'cuicuicui', 'comments': '', 'company': '', 'keywords': '', 'moddate': '2025-04-10T10:40:03+08:00', 'sourcemodified': \"D:20250410104003+08'00'\", 'subject': '', 'title': '', 'trapped': '/False', 'source': './data/pdfs.pdf', 'total_pages': 21, 'page': 20, 'page_label': '21'}, page_content='报告编号：202504A0200000018 报告版本：V1.0\\n北京蜂语网络科技有限公司 第 21 页 共 21 页\\n序号 测试项 测试说明 测试结果\\n3RE 容错性\\n系统能屏蔽用户常见的错误操作，以及 当软\\n件发生错误时，系统能进行提示。 通过')]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 3.加载Excel"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-13T05:19:26.135137Z",
     "start_time": "2025-04-13T05:19:24.581129Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# pip install unstructured\n",
    "# pip install \"unstructured[xlsx]\"\n",
    "# pip install nltk\n",
    "# from langchain_community.document_loaders import UnstructuredExcelLoader\n",
    "# excel_loader = UnstructuredExcelLoader(\"./data/example_excel.xlsx\", mode=\"elements\")\n",
    "# excel_loader.load()\n",
    "from langchain_community.document_loaders import DirectoryLoader\n",
    "\n",
    "loader = DirectoryLoader(\"./data\", glob=\"*.xlsx\")\n",
    "documents = loader.load()\n",
    "print(documents)"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR:langchain_community.document_loaders.directory:Error loading file data/example_excel.xlsx\n"
     ]
    },
    {
     "ename": "AttributeError",
     "evalue": "partially initialized module 'nltk' has no attribute 'data' (most likely due to a circular import)",
     "output_type": "error",
     "traceback": [
      "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[0;31mAttributeError\u001B[0m                            Traceback (most recent call last)",
      "Cell \u001B[0;32mIn[88], line 10\u001B[0m\n\u001B[1;32m      7\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mlangchain_community\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mdocument_loaders\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m DirectoryLoader\n\u001B[1;32m      9\u001B[0m loader \u001B[38;5;241m=\u001B[39m DirectoryLoader(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m./data\u001B[39m\u001B[38;5;124m\"\u001B[39m, glob\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m*.xlsx\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m---> 10\u001B[0m documents \u001B[38;5;241m=\u001B[39m \u001B[43mloader\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m     11\u001B[0m \u001B[38;5;28mprint\u001B[39m(documents)\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/langchain_community/document_loaders/directory.py:117\u001B[0m, in \u001B[0;36mDirectoryLoader.load\u001B[0;34m(self)\u001B[0m\n\u001B[1;32m    115\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mload\u001B[39m(\u001B[38;5;28mself\u001B[39m) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m List[Document]:\n\u001B[1;32m    116\u001B[0m \u001B[38;5;250m    \u001B[39m\u001B[38;5;124;03m\"\"\"Load documents.\"\"\"\u001B[39;00m\n\u001B[0;32m--> 117\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mlist\u001B[39;49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mlazy_load\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/langchain_community/document_loaders/directory.py:195\u001B[0m, in \u001B[0;36mDirectoryLoader.lazy_load\u001B[0;34m(self)\u001B[0m\n\u001B[1;32m    193\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m    194\u001B[0m     \u001B[38;5;28;01mfor\u001B[39;00m i \u001B[38;5;129;01min\u001B[39;00m items:\n\u001B[0;32m--> 195\u001B[0m         \u001B[38;5;28;01myield from\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_lazy_load_file(i, p, pbar)\n\u001B[1;32m    197\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m pbar:\n\u001B[1;32m    198\u001B[0m     pbar\u001B[38;5;241m.\u001B[39mclose()\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/langchain_community/document_loaders/directory.py:233\u001B[0m, in \u001B[0;36mDirectoryLoader._lazy_load_file\u001B[0;34m(self, item, path, pbar)\u001B[0m\n\u001B[1;32m    231\u001B[0m     \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m    232\u001B[0m         logger\u001B[38;5;241m.\u001B[39merror(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mError loading file \u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mstr\u001B[39m(item)\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m--> 233\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m e\n\u001B[1;32m    234\u001B[0m \u001B[38;5;28;01mfinally\u001B[39;00m:\n\u001B[1;32m    235\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m pbar:\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/langchain_community/document_loaders/directory.py:223\u001B[0m, in \u001B[0;36mDirectoryLoader._lazy_load_file\u001B[0;34m(self, item, path, pbar)\u001B[0m\n\u001B[1;32m    221\u001B[0m loader \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mloader_cls(\u001B[38;5;28mstr\u001B[39m(item), \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mloader_kwargs)\n\u001B[1;32m    222\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m--> 223\u001B[0m     \u001B[38;5;28;01mfor\u001B[39;00m subdoc \u001B[38;5;129;01min\u001B[39;00m loader\u001B[38;5;241m.\u001B[39mlazy_load():\n\u001B[1;32m    224\u001B[0m         \u001B[38;5;28;01myield\u001B[39;00m subdoc\n\u001B[1;32m    225\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mNotImplementedError\u001B[39;00m:\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/langchain_community/document_loaders/unstructured.py:107\u001B[0m, in \u001B[0;36mUnstructuredBaseLoader.lazy_load\u001B[0;34m(self)\u001B[0m\n\u001B[1;32m    105\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mlazy_load\u001B[39m(\u001B[38;5;28mself\u001B[39m) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m Iterator[Document]:\n\u001B[1;32m    106\u001B[0m \u001B[38;5;250m    \u001B[39m\u001B[38;5;124;03m\"\"\"Load file.\"\"\"\u001B[39;00m\n\u001B[0;32m--> 107\u001B[0m     elements \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_get_elements\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m    108\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_post_process_elements(elements)\n\u001B[1;32m    109\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmode \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124melements\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/langchain_community/document_loaders/unstructured.py:228\u001B[0m, in \u001B[0;36mUnstructuredFileLoader._get_elements\u001B[0;34m(self)\u001B[0m\n\u001B[1;32m    226\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfile_path, Path):\n\u001B[1;32m    227\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfile_path \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mfile_path)\n\u001B[0;32m--> 228\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mpartition\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfilename\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfile_path\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43munstructured_kwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/unstructured/partition/auto.py:289\u001B[0m, in \u001B[0;36mpartition\u001B[0;34m(filename, file, encoding, content_type, url, headers, ssl_verify, request_timeout, strategy, skip_infer_table_types, ocr_languages, languages, detect_language_per_element, pdf_infer_table_structure, extract_images_in_pdf, extract_image_block_types, extract_image_block_output_dir, extract_image_block_to_payload, data_source_metadata, metadata_filename, hi_res_model_name, model_name, starting_page_number, **kwargs)\u001B[0m\n\u001B[1;32m    286\u001B[0m partitioning_kwargs[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mextract_image_block_types\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m extract_image_block_types\n\u001B[1;32m    287\u001B[0m partitioning_kwargs[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mextract_image_block_to_payload\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m extract_image_block_to_payload\n\u001B[0;32m--> 289\u001B[0m partition \u001B[38;5;241m=\u001B[39m \u001B[43mpartitioner_loader\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfile_type\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m    290\u001B[0m elements \u001B[38;5;241m=\u001B[39m partition(filename\u001B[38;5;241m=\u001B[39mfilename, file\u001B[38;5;241m=\u001B[39mfile, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mpartitioning_kwargs)\n\u001B[1;32m    291\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m augment_metadata(elements)\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/unstructured/partition/auto.py:362\u001B[0m, in \u001B[0;36m_PartitionerLoader.get\u001B[0;34m(self, file_type)\u001B[0m\n\u001B[1;32m    359\u001B[0m \u001B[38;5;66;03m# -- if the partitioner is not in the cache, load it; note this raises if one or more of\u001B[39;00m\n\u001B[1;32m    360\u001B[0m \u001B[38;5;66;03m# -- the partitioner's dependencies is not installed.\u001B[39;00m\n\u001B[1;32m    361\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m file_type \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_partitioners:\n\u001B[0;32m--> 362\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_partitioners[file_type] \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_load_partitioner\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfile_type\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m    364\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_partitioners[file_type]\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/unstructured/partition/auto.py:380\u001B[0m, in \u001B[0;36m_PartitionerLoader._load_partitioner\u001B[0;34m(self, file_type)\u001B[0m\n\u001B[1;32m    378\u001B[0m \u001B[38;5;66;03m# -- load the partitioner and return it --\u001B[39;00m\n\u001B[1;32m    379\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m file_type\u001B[38;5;241m.\u001B[39mis_partitionable  \u001B[38;5;66;03m# -- would be a programming error if this failed --\u001B[39;00m\n\u001B[0;32m--> 380\u001B[0m partitioner_module \u001B[38;5;241m=\u001B[39m \u001B[43mimportlib\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mimport_module\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfile_type\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mpartitioner_module_qname\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m    381\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mgetattr\u001B[39m(partitioner_module, file_type\u001B[38;5;241m.\u001B[39mpartitioner_function_name)\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/importlib/__init__.py:126\u001B[0m, in \u001B[0;36mimport_module\u001B[0;34m(name, package)\u001B[0m\n\u001B[1;32m    124\u001B[0m             \u001B[38;5;28;01mbreak\u001B[39;00m\n\u001B[1;32m    125\u001B[0m         level \u001B[38;5;241m+\u001B[39m\u001B[38;5;241m=\u001B[39m \u001B[38;5;241m1\u001B[39m\n\u001B[0;32m--> 126\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43m_bootstrap\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_gcd_import\u001B[49m\u001B[43m(\u001B[49m\u001B[43mname\u001B[49m\u001B[43m[\u001B[49m\u001B[43mlevel\u001B[49m\u001B[43m:\u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpackage\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mlevel\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[0;32m<frozen importlib._bootstrap>:1050\u001B[0m, in \u001B[0;36m_gcd_import\u001B[0;34m(name, package, level)\u001B[0m\n",
      "File \u001B[0;32m<frozen importlib._bootstrap>:1027\u001B[0m, in \u001B[0;36m_find_and_load\u001B[0;34m(name, import_)\u001B[0m\n",
      "File \u001B[0;32m<frozen importlib._bootstrap>:1006\u001B[0m, in \u001B[0;36m_find_and_load_unlocked\u001B[0;34m(name, import_)\u001B[0m\n",
      "File \u001B[0;32m<frozen importlib._bootstrap>:688\u001B[0m, in \u001B[0;36m_load_unlocked\u001B[0;34m(spec)\u001B[0m\n",
      "File \u001B[0;32m<frozen importlib._bootstrap_external>:883\u001B[0m, in \u001B[0;36mexec_module\u001B[0;34m(self, module)\u001B[0m\n",
      "File \u001B[0;32m<frozen importlib._bootstrap>:241\u001B[0m, in \u001B[0;36m_call_with_frames_removed\u001B[0;34m(f, *args, **kwds)\u001B[0m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/unstructured/partition/xlsx.py:28\u001B[0m\n\u001B[1;32m     26\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mfile_utils\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mmodel\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m FileType\n\u001B[1;32m     27\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mpartition\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mcommon\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mmetadata\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m apply_metadata, get_last_modified_date\n\u001B[0;32m---> 28\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mpartition\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mtext_type\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m (\n\u001B[1;32m     29\u001B[0m     is_bulleted_text,\n\u001B[1;32m     30\u001B[0m     is_possible_narrative_text,\n\u001B[1;32m     31\u001B[0m     is_possible_numbered_list,\n\u001B[1;32m     32\u001B[0m     is_possible_title,\n\u001B[1;32m     33\u001B[0m )\n\u001B[1;32m     34\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mutils\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m lazyproperty\n\u001B[1;32m     36\u001B[0m _CellCoordinate: TypeAlias \u001B[38;5;241m=\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtuple[int, int]\u001B[39m\u001B[38;5;124m\"\u001B[39m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/unstructured/partition/text_type.py:20\u001B[0m\n\u001B[1;32m     11\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mnlp\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01menglish_words\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m ENGLISH_WORDS\n\u001B[1;32m     12\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mnlp\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mpatterns\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m (\n\u001B[1;32m     13\u001B[0m     EMAIL_ADDRESS_PATTERN_RE,\n\u001B[1;32m     14\u001B[0m     ENDS_IN_PUNCT_RE,\n\u001B[0;32m   (...)\u001B[0m\n\u001B[1;32m     18\u001B[0m     US_PHONE_NUMBERS_RE,\n\u001B[1;32m     19\u001B[0m )\n\u001B[0;32m---> 20\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01munstructured\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mnlp\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mtokenize\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m pos_tag, sent_tokenize, word_tokenize\n\u001B[1;32m     22\u001B[0m POS_VERB_TAGS: Final[List[\u001B[38;5;28mstr\u001B[39m]] \u001B[38;5;241m=\u001B[39m [\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mVB\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mVBG\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mVBD\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mVBN\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mVBP\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mVBZ\u001B[39m\u001B[38;5;124m\"\u001B[39m]\n\u001B[1;32m     23\u001B[0m ENGLISH_WORD_SPLIT_RE \u001B[38;5;241m=\u001B[39m re\u001B[38;5;241m.\u001B[39mcompile(\u001B[38;5;124mr\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m[\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124ms\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124m-,.!?_\u001B[39m\u001B[38;5;124m\\\u001B[39m\u001B[38;5;124m/]+\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/unstructured/nlp/tokenize.py:7\u001B[0m\n\u001B[1;32m      4\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mfunctools\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m lru_cache\n\u001B[1;32m      5\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mtyping\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m Final, List, Tuple\n\u001B[0;32m----> 7\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mnltk\u001B[39;00m\n\u001B[1;32m      8\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mnltk\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m pos_tag \u001B[38;5;28;01mas\u001B[39;00m _pos_tag\n\u001B[1;32m      9\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mnltk\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m sent_tokenize \u001B[38;5;28;01mas\u001B[39;00m _sent_tokenize\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/nltk/__init__.py:180\u001B[0m\n\u001B[1;32m    177\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m    178\u001B[0m     \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mnltk\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m cluster\n\u001B[0;32m--> 180\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01mnltk\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mdownloader\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m download, download_shell\n\u001B[1;32m    182\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m    183\u001B[0m     \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mtkinter\u001B[39;00m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/nltk/downloader.py:2475\u001B[0m\n\u001B[1;32m   2465\u001B[0m             \u001B[38;5;28;01mpass\u001B[39;00m\n\u001B[1;32m   2468\u001B[0m \u001B[38;5;66;03m######################################################################\u001B[39;00m\n\u001B[1;32m   2469\u001B[0m \u001B[38;5;66;03m# Main:\u001B[39;00m\n\u001B[1;32m   2470\u001B[0m \u001B[38;5;66;03m######################################################################\u001B[39;00m\n\u001B[0;32m   (...)\u001B[0m\n\u001B[1;32m   2473\u001B[0m \n\u001B[1;32m   2474\u001B[0m \u001B[38;5;66;03m# Aliases\u001B[39;00m\n\u001B[0;32m-> 2475\u001B[0m _downloader \u001B[38;5;241m=\u001B[39m \u001B[43mDownloader\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m   2476\u001B[0m download \u001B[38;5;241m=\u001B[39m _downloader\u001B[38;5;241m.\u001B[39mdownload\n\u001B[1;32m   2479\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mdownload_shell\u001B[39m():\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/nltk/downloader.py:515\u001B[0m, in \u001B[0;36mDownloader.__init__\u001B[0;34m(self, server_index_url, download_dir)\u001B[0m\n\u001B[1;32m    513\u001B[0m \u001B[38;5;66;03m# decide where we're going to save things to.\u001B[39;00m\n\u001B[1;32m    514\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_download_dir \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m--> 515\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_download_dir \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdefault_download_dir\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/nltk/downloader.py:1068\u001B[0m, in \u001B[0;36mDownloader.default_download_dir\u001B[0;34m(self)\u001B[0m\n\u001B[1;32m   1064\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m\n\u001B[1;32m   1066\u001B[0m \u001B[38;5;66;03m# Check if we have sufficient permissions to install in a\u001B[39;00m\n\u001B[1;32m   1067\u001B[0m \u001B[38;5;66;03m# variety of system-wide locations.\u001B[39;00m\n\u001B[0;32m-> 1068\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m nltkdir \u001B[38;5;129;01min\u001B[39;00m \u001B[43mnltk\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdata\u001B[49m\u001B[38;5;241m.\u001B[39mpath:\n\u001B[1;32m   1069\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m os\u001B[38;5;241m.\u001B[39mpath\u001B[38;5;241m.\u001B[39mexists(nltkdir) \u001B[38;5;129;01mand\u001B[39;00m nltk\u001B[38;5;241m.\u001B[39minternals\u001B[38;5;241m.\u001B[39mis_writable(nltkdir):\n\u001B[1;32m   1070\u001B[0m         \u001B[38;5;28;01mreturn\u001B[39;00m nltkdir\n",
      "\u001B[0;31mAttributeError\u001B[0m: partially initialized module 'nltk' has no attribute 'data' (most likely due to a circular import)"
     ]
    }
   ],
   "execution_count": 88
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 4.统一封装"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-13T05:19:33.269733Z",
     "start_time": "2025-04-13T05:19:33.130161Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 删除索引\n",
    "import chromadb\n",
    "client = chromadb.Client()\n",
    "# client.list_collections()\n",
    "client.delete_collection(\"langchain\")"
   ],
   "outputs": [
    {
     "ename": "InternalError",
     "evalue": "Database error: error returned from database: (code: 1) no such table: tenants",
     "output_type": "error",
     "traceback": [
      "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[0;31mInternalError\u001B[0m                             Traceback (most recent call last)",
      "Cell \u001B[0;32mIn[89], line 3\u001B[0m\n\u001B[1;32m      1\u001B[0m \u001B[38;5;66;03m# 删除索引\u001B[39;00m\n\u001B[1;32m      2\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mchromadb\u001B[39;00m\n\u001B[0;32m----> 3\u001B[0m client \u001B[38;5;241m=\u001B[39m \u001B[43mchromadb\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mClient\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m      4\u001B[0m \u001B[38;5;66;03m# client.list_collections()\u001B[39;00m\n\u001B[1;32m      5\u001B[0m client\u001B[38;5;241m.\u001B[39mdelete_collection(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mlangchain\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/chromadb/__init__.py:371\u001B[0m, in \u001B[0;36mClient\u001B[0;34m(settings, tenant, database)\u001B[0m\n\u001B[1;32m    368\u001B[0m tenant \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(tenant)\n\u001B[1;32m    369\u001B[0m database \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(database)\n\u001B[0;32m--> 371\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mClientCreator\u001B[49m\u001B[43m(\u001B[49m\u001B[43mtenant\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtenant\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mdatabase\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mdatabase\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43msettings\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43msettings\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/chromadb/api/client.py:83\u001B[0m, in \u001B[0;36mClient.__init__\u001B[0;34m(self, tenant, database, settings)\u001B[0m\n\u001B[1;32m     81\u001B[0m \u001B[38;5;66;03m# Create an admin client for verifying that databases and tenants exist\u001B[39;00m\n\u001B[1;32m     82\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_admin_client \u001B[38;5;241m=\u001B[39m AdminClient\u001B[38;5;241m.\u001B[39mfrom_system(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_system)\n\u001B[0;32m---> 83\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_validate_tenant_database\u001B[49m\u001B[43m(\u001B[49m\u001B[43mtenant\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mtenant\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mdatabase\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdatabase\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m     85\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_submit_client_start_event()\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/chromadb/api/client.py:437\u001B[0m, in \u001B[0;36mClient._validate_tenant_database\u001B[0;34m(self, tenant, database)\u001B[0m\n\u001B[1;32m    435\u001B[0m \u001B[38;5;66;03m# Propagate ChromaErrors\u001B[39;00m\n\u001B[1;32m    436\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m ChromaError \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m--> 437\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m e\n\u001B[1;32m    438\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m:\n\u001B[1;32m    439\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[1;32m    440\u001B[0m         \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mCould not connect to tenant \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mtenant\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m. Are you sure it exists?\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m    441\u001B[0m     )\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/chromadb/api/client.py:430\u001B[0m, in \u001B[0;36mClient._validate_tenant_database\u001B[0;34m(self, tenant, database)\u001B[0m\n\u001B[1;32m    428\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_validate_tenant_database\u001B[39m(\u001B[38;5;28mself\u001B[39m, tenant: \u001B[38;5;28mstr\u001B[39m, database: \u001B[38;5;28mstr\u001B[39m) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m    429\u001B[0m     \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m--> 430\u001B[0m         \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_admin_client\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_tenant\u001B[49m\u001B[43m(\u001B[49m\u001B[43mname\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtenant\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m    431\u001B[0m     \u001B[38;5;28;01mexcept\u001B[39;00m httpx\u001B[38;5;241m.\u001B[39mConnectError:\n\u001B[1;32m    432\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[1;32m    433\u001B[0m             \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mCould not connect to a Chroma server. Are you sure it is running?\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m    434\u001B[0m         )\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/chromadb/api/client.py:487\u001B[0m, in \u001B[0;36mAdminClient.get_tenant\u001B[0;34m(self, name)\u001B[0m\n\u001B[1;32m    485\u001B[0m \u001B[38;5;129m@override\u001B[39m\n\u001B[1;32m    486\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mget_tenant\u001B[39m(\u001B[38;5;28mself\u001B[39m, name: \u001B[38;5;28mstr\u001B[39m) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m Tenant:\n\u001B[0;32m--> 487\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_server\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_tenant\u001B[49m\u001B[43m(\u001B[49m\u001B[43mname\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mname\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[0;32m/opt/anaconda3/envs/langchain/lib/python3.10/site-packages/chromadb/api/rust.py:159\u001B[0m, in \u001B[0;36mRustBindingsAPI.get_tenant\u001B[0;34m(self, name)\u001B[0m\n\u001B[1;32m    157\u001B[0m \u001B[38;5;129m@override\u001B[39m\n\u001B[1;32m    158\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mget_tenant\u001B[39m(\u001B[38;5;28mself\u001B[39m, name: \u001B[38;5;28mstr\u001B[39m) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m Tenant:\n\u001B[0;32m--> 159\u001B[0m     tenant \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbindings\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_tenant\u001B[49m\u001B[43m(\u001B[49m\u001B[43mname\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m    160\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m Tenant(name\u001B[38;5;241m=\u001B[39mtenant\u001B[38;5;241m.\u001B[39mname)\n",
      "\u001B[0;31mInternalError\u001B[0m: Database error: error returned from database: (code: 1) no such table: tenants"
     ]
    }
   ],
   "execution_count": 89
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-13T07:37:39.224898Z",
     "start_time": "2025-04-13T07:37:23.664824Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# pip install docx2txt\n",
    "# pip install pypdf\n",
    "# pip install -qU langchain_postgres\n",
    "from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "from langchain_community.vectorstores import Chroma\n",
    "from langchain_ollama import OllamaEmbeddings\n",
    "from langchain_postgres import PGVector\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.retrievers.multi_query import MultiQueryRetriever\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "from langchain.retrievers.contextual_compression import ContextualCompressionRetriever\n",
    "from langchain.retrievers.document_compressors import LLMChainExtractor\n",
    "\n",
    "# See docker command above to launch a postgres instance with pgvector enabled.\n",
    "connection = \"postgresql+psycopg://langchain:langchain@10.2.4.31:6024/langchain\"  # Uses psycopg3!\n",
    "collection_name = \"my_docs\"\n",
    "\n",
    "embeddings = OllamaEmbeddings(\n",
    "            # model=\"quentinz/bge-large-zh-v1.5:latest\",\n",
    "            model=\"qllama/bce-embedding-base_v1:latest\",\n",
    "            base_url=\"http://10.2.4.31:11434\")\n",
    "\n",
    "llm = ChatOpenAI(model=\"qwen2.5:latest\", \n",
    "             openai_api_key=\"ollama\", \n",
    "             openai_api_base=\"http://10.2.4.31:11434/v1/\")\n",
    "\n",
    "class ChatDoc():\n",
    "    def __init__(self, doc):\n",
    "        self.docs = None\n",
    "        self.doc = doc\n",
    "        self.doc_text = None\n",
    "        self.template = [\n",
    "            (\"system\", \"你是一个处理文档的秘书，你从不说自己是一个大模型或者AI助手，你会根据下面提供的上下文内容继续回答问题\\n. 上下文内容: {context}\"),\n",
    "            (\"human\", \"你好！\"),\n",
    "            (\"ai\", \"你好！\"),\n",
    "            (\"human\", \"{question}\")\n",
    "        ]\n",
    "        self.prompt = ChatPromptTemplate.from_messages(self.template)\n",
    "        \n",
    "    def getFile(self):\n",
    "        \"\"\"\n",
    "        加载文件\n",
    "        :return: \n",
    "        \"\"\"\n",
    "        loader = {\n",
    "            \"docx\": Docx2txtLoader,\n",
    "            \"pdf\": PyPDFLoader\n",
    "        }\n",
    "        ext = self.doc.split(\".\")[-1]\n",
    "        loader_class = loader.get(ext)\n",
    "        if loader_class:\n",
    "            try:    \n",
    "                loader = loader_class(self.doc)\n",
    "                self.doc_text = loader.load()\n",
    "            except Exception as e:\n",
    "                print(f\"Error Loading , Error Message {e}\")\n",
    "                return None\n",
    "        else:\n",
    "            print(f\"{ext} not support\")\n",
    "        return self.doc_text\n",
    "    \n",
    "    def textSplit(self):\n",
    "        \"\"\"\n",
    "        文本分割\n",
    "        :return: \n",
    "        \"\"\"\n",
    "        full_text = self.getFile()\n",
    "        if full_text:\n",
    "            text_splitter = RecursiveCharacterTextSplitter(chunk_size=120, chunk_overlap=20)\n",
    "            self.docs = text_splitter.split_documents(self.doc_text)\n",
    "        return self.docs\n",
    "    \n",
    "    def embeddingDocument(self):\n",
    "        \"\"\"\n",
    "        向量化\n",
    "        :return: \n",
    "        \"\"\"\n",
    "        self.docs = self.textSplit()\n",
    "        \n",
    "        vector_store = PGVector(\n",
    "            embeddings=embeddings,\n",
    "            collection_name=collection_name,\n",
    "            connection=connection,\n",
    "            use_jsonb=True,\n",
    "        )\n",
    "        vector_store.delete_collection()\n",
    "        vector_store.create_collection()\n",
    "        # doc_search = Chroma.from_documents(self.docs, embedding=embeddings)\n",
    "        vector_store.add_documents(self.docs)\n",
    "        return vector_store\n",
    "        \n",
    "        \n",
    "   \n",
    "    def askAndFindFile(self, question):\n",
    "        \"\"\"\n",
    "        问题查询\n",
    "        :param question: 文档问题\n",
    "        :return: \n",
    "        \"\"\"\n",
    "        db = self.embeddingDocument()\n",
    "        retriever = db.as_retriever()\n",
    "        return retriever.invoke(question)\n",
    "    \n",
    "    ## 多重查询提高文档检索精度\n",
    "    def askAndFindText(self, question):\n",
    "        self.docs = self.textSplit()\n",
    "        db = self.embeddingDocument()\n",
    "        # 把问题交给LLM查看生成查询\n",
    "        retriever = MultiQueryRetriever.from_llm(\n",
    "            retriever=db.as_retriever(),\n",
    "            llm=llm)\n",
    "        return retriever.invoke(question)\n",
    "    ## 使用上下文压缩技术减少回答冗余\n",
    "    def askAndFindTextWithContext(self, question):\n",
    "        self.docs = self.textSplit()\n",
    "        db = self.embeddingDocument()\n",
    "        retriever = ContextualCompressionRetriever(\n",
    "            base_compressor=LLMChainExtractor.from_llm(llm),\n",
    "            # base_retriever=db.as_retriever(search_kwargs={\"k\": 1}),\n",
    "            base_retriever=db.as_retriever(),\n",
    "        )\n",
    "        return retriever.invoke(question)\n",
    "    ## 在向量库中使用最大边界相似性（MMR）和相似性打分检索\n",
    "    def askAndFindTextWithMMR(self, question):\n",
    "        self.docs = self.textSplit()\n",
    "        db = self.embeddingDocument()\n",
    "        # MMR 相似性搜索\n",
    "        # return db.as_retriever(search_type=\"mmr\", search_kwargs={\"k\": 1}).invoke(question)\n",
    "        # 相似性打分搜索\n",
    "        return db.similarity_search_with_score(query=question, k=1)\n",
    "    # 用自然语言和文档聊天\n",
    "    def chatWithDoc(self, question):\n",
    "        contents = \"\"\n",
    "        contexts = self.askAndFindTextWithContext(question)\n",
    "        for ctx in contexts:\n",
    "            contents += ctx.page_content\n",
    "        messages = self.prompt.format(context=contents, question=question)    \n",
    "        return llm.invoke(messages)\n",
    "    \n",
    "# 增加日志\n",
    "import logging\n",
    "logging.basicConfig(level=logging.DEBUG)\n",
    "# logging.getLogger(\"*\").setLevel(logging.DEBUG)\n",
    "\n",
    "# ChatDoc(\"./data/docx.docx\").getFile()  \n",
    "chatdoc = ChatDoc(\"./data/pdfs.pdf\")\n",
    "# chatdoc.askAndFindFile(\"这个产品的名称是什么？\")\n",
    "# chatdoc.askAndFindText(\"这个产品的名称是什么？\")\n",
    "# chatdoc.askAndFindTextWithContext(\"请输出测试公司名称？\")\n",
    "# chatdoc.askAndFindTextWithMMR(\"请输出测试公司名称？\")\n",
    "chatdoc.chatWithDoc(\"这个产品名称是什么？\").content"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/api/embed \"HTTP/1.1 200 OK\"\n",
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/api/embed \"HTTP/1.1 200 OK\"\n",
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/v1/chat/completions \"HTTP/1.1 200 OK\"\n",
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/v1/chat/completions \"HTTP/1.1 200 OK\"\n",
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/v1/chat/completions \"HTTP/1.1 200 OK\"\n",
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/v1/chat/completions \"HTTP/1.1 200 OK\"\n",
      "INFO:httpx:HTTP Request: POST http://10.2.4.31:11434/v1/chat/completions \"HTTP/1.1 200 OK\"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'您好，您问的是“数字技术应用实践平台”这个名称吗？这是一款注重实践操作的学习或培训平台，旨在帮助学习者在实际环境中应用所学的数字技术知识。如果需要了解更多关于该产品的信息，请随时告诉我！'"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 92
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": ""
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "\n"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchain",
   "language": "python",
   "name": "langchain"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
